#include "widget.h"
#include <QDebug>
#include <QRegExpValidator>
#include "ui_widget.h"

/*
 * TEST_1:
 * 1. 可以设置账号密码的默认 holder 提示信息
 * 2. 可以设置密码的显示格式
 * 3. 可以检查电话号码的格式，实时检查正确性
 * 4. 检查密码和确认密码是否相等
 * 5. 根据上述条件，保证条件不符合则无法进行提交
 * 6. 可以通过 checkbox 切换密码显示格式
 *
 * QLineEdit, Label, RadioButton
 * 		   QRegExpValidator 正则验证器, 传入 QRegExp 对象初始化
 *  	   验证器进行验证的时候，需要调用其成员 validator 的验证函数 validate 进行验证
 *         其中有两个参数，QString 第一个参数表示内容，int& 第二个参数表示出错的位置
 * validate(QString, int&) 会返回 QValidator::State，主要有两个状态 Invalid 和 Acceptable
 *
 * onTextEdit() 槽函数：当文件内容被修改时会被调用的函数
*/

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->tip->setText("");

    // 设置 Holder
    ui->user_edit->setPlaceholderText("请输入用户名");
    ui->pwd_edit->setPlaceholderText("请输入密码");
    ui->pwd2_edit->setPlaceholderText("请输入确认密码");

    // 设置 清空键
    ui->user_edit->setClearButtonEnabled(true);

    // 设置 密码 的显示格式
    ui->pwd_edit->setEchoMode(QLineEdit::Password);
    ui->pwd2_edit->setEchoMode(QLineEdit::Password);

    // 设置 号码 的输入格式，0表示数字, 进行简单的校验
    // ui->tel_edit->setInputMask("000-0000-0000");
    // 也可以使用正则表达式, 通过该 QLineEdit 内部的验证器来进行正则表达式验证
    QRegExp regexp("^1\\d{10}$");
    ui->tel_edit->setValidator(new QRegExpValidator(regexp));
}

void Widget::on_submit_clicked()
{
    // 获取 性别 的选中状态, 复选框本身就是互斥的，如果要不互斥，那么需要进行分组
    QString sex = ui->male_radio->isChecked() ? "Male" : "Female";

    qDebug() << "User: " << ui->user_edit->text() << endl
             << "Pwd: " << ui->pwd_edit->text() << endl
             << "Sex: " << sex << endl
             << "Telephone: " << ui->tel_edit->text();
}


// 当电话内容被修改的时候，需要进行的操作
void Widget::on_tel_edit_textEdited(const QString& text)
{
    // 获取 电话框 的验证器，并调用它的验证函数
    int pos = 0;
    QString content(text);
    if (ui->tel_edit->validator()->validate(content, pos) == QValidator::State::Acceptable) {
        ui->submit->setEnabled(true);
    }
    else {
        ui->submit->setEnabled(false);
    }
}

// 密码被修改时
void Widget::on_pwd_edit_textEdited(const QString &)
{
    pwd_compare();
}

// 当 checkbox 状态变化的时候会调用这个函数，如 true->false or false->true
void Widget::on_isdisplay_toggled(bool checked)
{
    if (checked) {
        ui->pwd_edit->setEchoMode(QLineEdit::Normal);
    }
    else {
        ui->pwd_edit->setEchoMode(QLineEdit::Password);
    }
}


// 定义 密码和确认密码 的比较方式
void Widget::pwd_compare()
{
    QString pwd = ui->pwd_edit->text();
    QString pwd2 = ui->pwd2_edit->text();
    if (pwd.isEmpty() || pwd2.isEmpty() || pwd != pwd2) {
        ui->tip->setText("两次密码输入不一致");
    }
    else {
        ui->tip->setText("");
    }
}

Widget::~Widget()
{
    delete ui;
}

